﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.IO;

namespace Jurassic_Island
{
    public partial class FormInsertLugar : Form
    {
        private ENLugares enLug;
        private DataSet dsLugares;
        private bool editMode = false;
        private string exprCoord = @"^[0-9]+$";
        private OpenFileDialog opdSubirImagen;
        private string nombreLugar = "";

        public FormInsertLugar()
        {
            enLug = new ENLugares();
            InitializeComponent();
        }

        public FormInsertLugar(ENLugares enLug)
        {
            this.editMode = true;
            this.enLug = enLug;
            InitializeComponent();
            this.Text = "Editar Lugar";
            tbNombre.Text = enLug.Nombre;
            tbX.Text = enLug.CoordX.ToString();
            tbY.Text = enLug.CoordY.ToString();
            tbDesc.Text = enLug.Descripcion;
            if (enLug.Imagen != "")
            {
                try
                {
                    pbImagen.Image = System.Drawing.Bitmap.FromFile(rutaImagen(enLug.Imagen));
                }
                catch (Exception)
                {
                    pbImagen.Image = null;
                }
            }
            else
                pbImagen.Image = null;
        }

        private void FormInsertLugar_Load(object sender, EventArgs e)
        {

        }

        //devuelve true si no hay dependencias
        private bool ComprobarNoDependencias(String lugar)
        {
            bool resultado = true;

            try
            {
                string aviso = "Se van a editar también las dependencias que se encuentran en:\n";

                ENCaminos enCam = new ENCaminos();
                ENFinal enFin = new ENFinal();
                ENEventosLocalizacion enEvLoc = new ENEventosLocalizacion();
                DataSet dsCam;
                DataSet dsFin;
                DataSet dsEvLoc;
                dsCam = enCam.ObtenerListaCaminosPorLugar(lugar);
                dsFin = enFin.ObtenerListaFinalesPorLugar(lugar);
                dsEvLoc = enEvLoc.ObtenerListaEventosLocalizacionPorLugar(lugar);

                int numCam = dsCam.Tables["Caminos"].Rows.Count;
                int numFin = dsFin.Tables["Finales"].Rows.Count;
                int numEvLoc = dsEvLoc.Tables["Eventos_Localizacion"].Rows.Count;

                if (numCam>0)
                {
                    aviso += "- Caminos";
                    if (MessageBox.Show(aviso, "Confirmar", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
                        resultado = false;
                }
                else if (numFin>0)
                {
                    aviso += "- Finales";
                    if (MessageBox.Show(aviso, "Confirmar", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
                        resultado = false;
                }
                else if (numEvLoc>0)
                {

                    aviso += "- Eventos de localización";
                    if (MessageBox.Show(aviso, "Confirmar", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
                        resultado = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return resultado;
        }

        private bool ValidarCampos()
        {
            bool correcto = true;

            try
            {
                string errores = "Corrige los siguientes errores:\n";

                if (tbNombre.Text == "")
                {
                    correcto = false;
                    errores += "-Introduce un nombre\n";
                    epInsertLugar.SetError(tbNombre, "Introduce un nombre");
                }
                else if (enLug.ExisteLugar(tbNombre.Text) && editMode == false)
                {
                    correcto = false;
                    errores += "-El lugar introducido ya existe\n";
                    epInsertLugar.SetError(tbNombre, "El nombre ya existe");
                }
                else
                {
                    epInsertLugar.SetError(tbNombre, "");
                }

                if (tbX.Text == "")
                {
                    correcto = false;
                    errores += "-Introduce una coordenada X correcta (número entero)\n";
                    epInsertLugar.SetError(tbX, "Introduce una coordenada X correcta (número entero)");
                }
                else
                {
                    try
                    {
                        try
                        {
                            int pruebaX = Int16.Parse(tbX.Text);
                            if (pruebaX >= 0 && pruebaX <= 2000)
                                epInsertLugar.SetError(tbX, "");
                            else
                            {
                                correcto = false;
                                errores += "-La coordenada X se sale de los límites (0 - 2000)\n";
                                epInsertLugar.SetError(tbX, "La coordenada X se sale de los límites (0 - 2000)");
                            }
                        }
                        catch (Exception)
                        {
                            correcto = false;
                            errores += "-La coordenada X se sale de los límites (0 - 2000)\n";
                            epInsertLugar.SetError(tbX, "La coordenada X se sale de los límites (0 - 2000)");
                        }
                    }
                    catch (Exception fEx)
                    {
                        correcto = false;
                        errores += "-Introduce una coordenada X correcta (número entero)\n";
                        epInsertLugar.SetError(tbX, "Introduce una coordenada X correcta (número entero)");
                    }
                }


                if (tbY.Text == "")
                {
                    correcto = false;
                    errores += "-Introduce una coordenada Y correcta (número entero)\n";
                    epInsertLugar.SetError(tbY, "Introduce una coordenada Y correcta (número entero)");
                }
                else
                {
                    try
                    {
                        try
                        {
                            int pruebaY = Int16.Parse(tbY.Text);
                            if (pruebaY >= 0 && pruebaY <= 1500)
                                epInsertLugar.SetError(tbY, "");
                            else
                            {
                                correcto = false;
                                errores += "-La coordenada Y se sale de los límites (0 - 1500)\n";
                                epInsertLugar.SetError(tbY, "La coordenada Y se sale de los límites (0 - 1500)");
                            }
                        }
                        catch (Exception)
                        {
                            correcto = false;
                            errores += "-La coordenada Y se sale de los límites (0 - 1500)\n";
                            epInsertLugar.SetError(tbY, "La coordenada Y se sale de los límites (0 - 1500)");
                        }
                    }
                    catch (Exception fEx)
                    {
                        correcto = false;
                        errores += "-Coordenada Y incorrecta";
                        epInsertLugar.SetError(tbY, "Coordenada Y incorrecta");
                    }
                }

                if (!correcto)
                {
                    throw new Exception(errores);
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return correcto;
        }


        private void btCerrar_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        

        private void btAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                //enLug = new ENLugares();
                dsLugares = new DataSet();
                bool cancelar = false;

                if (ValidarCampos())
                {
                    dsLugares = enLug.ObtenerListaLugares();

                    if (editMode)
                    {
                        int i = 0;
                        
                        
                        foreach (DataRow dr in dsLugares.Tables["Lugares"].Rows)
                        {
                            if (enLug.Nombre.ToString() == dsLugares.Tables["Lugares"].Rows[i]["Nombre"].ToString())
                            {
                                if (ComprobarNoDependencias(dsLugares.Tables["Lugares"].Rows[i]["Nombre"].ToString()))
                                {
                                    dsLugares.Tables["Lugares"].Rows[i]["Nombre"] = tbNombre.Text;
                                    dsLugares.Tables["Lugares"].Rows[i]["Coordenada X"] = Int16.Parse(tbX.Text);
                                    dsLugares.Tables["Lugares"].Rows[i]["Coordenada Y"] = Int16.Parse(tbY.Text);
                                    dsLugares.Tables["Lugares"].Rows[i]["Descripcion"] = tbDesc.Text;
                                    if (opdSubirImagen != null)
                                        nombreLugar = Path.GetFileName(opdSubirImagen.FileName);
                                    dsLugares.Tables["Lugares"].Rows[i]["Imagen"] = nombreLugar;
                                    if (nombreLugar != "")
                                        pbImagen.Image.Save(rutaImagen(nombreLugar), System.Drawing.Imaging.ImageFormat.Jpeg);

                                }
                                else
                                {
                                    cancelar = true;
                                }
                                break;
                            }

                            i++;
                        }
                    }

                    else
                    {
                        DataRow row = dsLugares.Tables["Lugares"].NewRow();
                        row["Nombre"] = tbNombre.Text;
                        row["Coordenada X"] = Int16.Parse(tbX.Text);
                        row["Coordenada Y"] = Int16.Parse(tbY.Text);
                        row["Descripcion"] = tbDesc.Text;
                        nombreLugar = Path.GetFileName(opdSubirImagen.FileName);
                        row["Imagen"] = nombreLugar;
                        if (nombreLugar != "")
                            pbImagen.Image.Save(rutaImagen(nombreLugar), System.Drawing.Imaging.ImageFormat.Jpeg);
                        dsLugares.Tables["Lugares"].Rows.Add(row);
                    }

                    if (!cancelar)
                    {
                        if (enLug.ActualizarLugares(dsLugares))
                        {
                            if (editMode)
                                MessageBox.Show("Lugar editado correctamente", "Éxito al editar", MessageBoxButtons.OK, MessageBoxIcon.Information);

                            else
                                MessageBox.Show("Lugar insertado correctamente", "Éxito al insertar", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            this.Dispose();
                        }
                        else
                            MessageBox.Show("Error, no se ha podido insertar el lugar", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void tbX_TextChanged(object sender, EventArgs e)
        {
            if (!Regex.IsMatch(tbX.Text, exprCoord))
            {
                epInsertLugar.SetError(tbX, "Introduce una coordenada X correcta (número entero o decimal).");
            }
            else
            {
                epInsertLugar.SetError(tbX, "");
            }
        }

        private void tbY_TextChanged(object sender, EventArgs e)
        {
            if (!Regex.IsMatch(tbY.Text, exprCoord))
            {
                epInsertLugar.SetError(tbY, "Introduce una coordenada Y correcta (número entero o decimal).");
            }
            else
            {
                epInsertLugar.SetError(tbY, "");
            }
        }

        private void tbNombre_TextChanged(object sender, EventArgs e)
        {
            epInsertLugar.SetError(tbNombre, "");
        }

        private void tbDesc_TextChanged(object sender, EventArgs e)
        {

        }

        private void btImagen_Click(object sender, EventArgs e)
        {
            opdSubirImagen = new OpenFileDialog();

            try
            {
                if (opdSubirImagen.ShowDialog() == DialogResult.OK)
                {
                    pbImagen.Image = System.Drawing.Bitmap.FromFile(opdSubirImagen.FileName);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al cargar el archivo. " + ex.Message, "Jurassic Island", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
            }

        }

        private String rutaImagen(String fichero)
        {
            //cwd: Ruta de ejecución del ejecutable windows
            string cwd = System.Reflection.Assembly.GetExecutingAssembly().Location;
            //Nombre del proyecto
            string projectName = "Jurassic Island";
            //Ruta de la solucion
            string solutionPath = cwd.Replace(projectName + @"\bin\Debug\", "");
            //Directorio de la solucion
            string SolutionDirectory = Path.GetDirectoryName(solutionPath);

            //Directorio del proyecto web
            string webPath = SolutionDirectory + @"\JurassicIslandWeb\Images\Lugares";

            return (webPath + @"\" + fichero);
        }
    }
}
